﻿//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
// 프로그램 명		: frmProtoType.cs
// 프로그램 기능	: WebParse 사용 샘플
// 클래스 기능		: frmProtoType 지원 클래스
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// 개발자			: 김승현, 조범준
// 개발일			: 2014-06-17
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// F/W 버전		    : Dot NET Compack Framework 4.0 Service Pack 1 Patch
// 라이센스			: Copyright ⓒ 2014-2014 All rights reserved.
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// 명명규칙			: 클래스(class) 명				- "c" + 클래스명
//					  전역(private) 상수			- "MC_" + 상수명
//					  공용(public)  상수			- "PC_" + 상수명
//					  전역(private) 변수/객체/핸들/구조체/컬렉션/델리게이트
//													- "mv_" + 타입/obj_/hwnd_/stru_/coll_/del_ + 명
//					  공용(public)  변수/객체/핸들/구조체/컬렉션/델리게이트/이벤트
//													- "pv_" + 타입/obj_/hwnd_/stru_/coll_/del_/evnt_ + 명
//					  공용(public)  속성(Property)	- "pp_" + 타입 + 속성명
//					  전역(private) 함수/API		- "mf_" + 함수명/API 함수명
//					  공용(public)  함수/API		- "pf_" + 함수명/API 함수명
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
// 개발자는 개발/수정시 위의 내용을 반드시 작성하며 내용이 일치하지 않을때에는 모든 사항을 개발자가 책임 진다.
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
using System.IO;
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
namespace TimsXBX
{
	///▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
	/// <summary>frmSub1 클래스</summary>
	///▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
	public partial class frmProtoType : Form
	{
		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [생성자/소멸자]
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>생성자</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public frmProtoType(frmMain fMain)
		{
			InitializeComponent();

			mf_Init(this);

			this.mv_frmMain = fMain;
		}
		public frmProtoType()
		{
			InitializeComponent();
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>소멸자</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		~frmProtoType()
		{
			mf_UnInit(this);
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 상수/나열형 - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 상수명 첫 문자는 "MC_" 로 시작
		//         - 전체를 영문 대문자로 하고 상수명이 긴 경우 '_'로 구분해서 명명
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		///<summary>전역(private) 상수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private const string MC_HELLO = "Hello...";
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 상수/나열형 - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 상수명 첫 문자는 "PC_" 로 시작
		//         - 전체를 영문 대문자로 하고 상수명이 긴 경우 '_'로 구분해서 명명
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		///<summary>공용(public) 상수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public const string PC_HELLO = "Hello...";
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 변수/객체/핸들/구조체/컬렉션/델리게이트 - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "mv_타입"/"mv_obj"/"mv_hwnd"/"mv_struc"/"mv_coll"/"mv_del" 로 시작
		//         - 영문 대소문자로 시작하고 변수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>전역(private) 변수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private string mv_sHello = null;
		//---------------------------------------------------------------------------------------------------
		//메인 폼 객체 핸들
		//---------------------------------------------------------------------------------------------------
		private frmMain mv_frmMain = null;										//메인 폼 인스턴스 핸들
		private ComCls.cFunction mv_oFunc = null;								//공용함수 인스턴스 핸들
		//---------------------------------------------------------------------------------------------------
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 변수/객체/핸들/구조체/컬렉션/델리게이트/이벤트 - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "pv_타입"/"pv_obj"/"pv_hwnd"/"pv_struc"/"pv_coll"/"pv_del"/"pv_event" 로 시작
		//         - 영문 대소문자로 시작하고 변수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>공용(public) 변수 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public string pv_sHello = null;
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 속성(Property:읽기 쓰기 선택적 가능) - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "pp_타입" 로 시작
		//         - 영문 대소문자로 시작하고 속성명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>공용(public) 속성(Property) 선언 예</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		public string pp_bHello
		{
			get { return mv_sHello; }
			set { mv_sHello = value; }
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 함수/API - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "mf_" + 함수명 또는 API 함수명 으로 시작
		//         - 영문 대소문자로 시작하고 함수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>전역(private) 함수 선언 예</summary>
		/// <param name="sStr">전역(private) 함수 인자 선언 예</param>
		/// <returns>string</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private string mf_Hello(string sStr)
		{
			try
			{
				sStr = "Hello...";
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return sStr;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>클래스 초기화</summary>
		/// <param name="objClass">클래스 객체 인스턴스</param>
		/// <returns>void</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private void mf_Init(frmProtoType objClass)
		{
			try
			{
				//클래스 초기화
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>클래스 마무리</summary>
		/// <param name="objClass">클래스 객체 인스턴스</param>
		/// <returns>void</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private void mf_UnInit(frmProtoType objClass)
		{
			try
			{
				//클래스 마무리
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>메인 폼 최초 실행 시 초기화할 내용 처리</summary>
		/// <returns>void</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private void mf_init()
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//공용함수 인스턴스 생성
				//---------------------------------------------------------------------------------------------------
				this.mv_oFunc = new ComCls.cFunction(this);
				//---------------------------------------------------------------------------------------------------
				//데이터그리드뷰 초기화
				//---------------------------------------------------------------------------------------------------
				this.mv_oFunc.pf_DataGridViewInit(this.dgvMan, 4, true, false);
				//---------------------------------------------------------------------------------------------------
				//트리뷰 초기화
				//---------------------------------------------------------------------------------------------------
				//트리뷰 기본 초기화
				this.mv_oFunc.pf_TreeInit(this.treeMan,
											this.mf_TreeNode_BeforeExpand_ExecSql,
											this.mv_frmMain.imageTreeNode,
											ComCls.cConst.PC_TREEVIEW_NODEEXPAND_DBREAD_ALWAYS,
											System.Windows.Forms.MouseButtons.Right);
				//트리뷰 드래그 드롭 초기화
				this.mv_oFunc.pf_TreeInit_DragDrop(this.treeMan, this.mf_TreeNode_DragDrop_ExecSql, 2);//6);
				//트리뷰 컨텍스트 메뉴 초기화
				this.mv_oFunc.pf_TreeInit_ContextMenu(this.treeMan, new string[] { "Copy", "Move", "Paste", "-", "Delete" }, this.mf_TreeNode_ContextMenu_Click);
				//---------------------------------------------------------------------------------------------------
				//트리 리스트 뷰 초기화
				//---------------------------------------------------------------------------------------------------
				this.treeListMan.SmallImageList = this.mv_frmMain.imageTreeNode;
				//---------------------------------------------------------------------------------------------------
				//웹 파즈 경로 만들기
				//---------------------------------------------------------------------------------------------------
				this.txtUrl.Text = mf_MakeWpUrl();
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>웹 파즈 Url 만들기(CRUD)</summary>
		/// <returns>string</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private string mf_MakeWpUrl()
		{
			string sResult = null;
			string sCommand = null;

			try
			{
				//---------------------------------------------------------------------------------------------------
				//조회 작업
				//---------------------------------------------------------------------------------------------------
				if (this.radioModeR.Checked == true)
				{
					//---------------------------------------------------------------------------------------------------
					//트리 조회
					//---------------------------------------------------------------------------------------------------
					if (this.radioSelectTreeView.Checked == true || this.radioSelectTreeListView.Checked == true)
					{
						if (this.radioStyleText.Checked == true)
						{
							this.radioStyleSp.Checked = true;
						}
						else
						{
							sCommand = string.Format("{0}={1}&iGRP_OBJECTID={2}&iLevel={3}&iRootID={4}",
													ComCls.cConst.PC_WEBSQL_CMD_SP, "SP_BOM_TREE_R",
													2,
													this.txtLevel.Text,
													this.txtRootID.Text);
						}

						this.txtCommand.Text = sCommand;
					}
					//---------------------------------------------------------------------------------------------------
					//일반 테이블 조회
					//---------------------------------------------------------------------------------------------------
					else
					{
						if (this.radioStyleText.Checked == true)
						{
							sCommand = string.Format("CmdTXT=SELECT * FROM TB_BOM WHERE KName LIKE '%{0}%' AND Color='{1}' ORDER BY ID",
												this.mv_oFunc.pf_WpUrlEncode(this.txtKName.Text),
												this.mv_oFunc.pf_WpUrlEncode(this.txtColor.Text));
						}
						else
						{
							sCommand = string.Format("{0}={1}&iKName={2}&iColor={3}",
												ComCls.cConst.PC_WEBSQL_CMD_SP, "SP_BOM_R",
												this.mv_oFunc.pf_WpUrlEncode(this.txtKName.Text),
												this.mv_oFunc.pf_WpUrlEncode(this.txtColor.Text));
						}

						this.txtCommand.Text = sCommand;
					}
				}
				//---------------------------------------------------------------------------------------------------
				//단일 입력/수정/삭제 작업
				//---------------------------------------------------------------------------------------------------
				if (this.radioModeCUD.Checked == true)
				{
					if (this.radioStyleText.Checked == true)
					{
						sCommand = string.Format("CmdTXT=UPDATE TB_BOM SET Memo = '{0}' WHERE KName LIKE '%{1}%' AND Color='{2}'",
												this.mv_oFunc.pf_WpUrlEncode(this.txtMemo.Text),
												this.mv_oFunc.pf_WpUrlEncode(this.txtKName.Text),
												this.mv_oFunc.pf_WpUrlEncode(this.txtColor.Text));
					}
					else
					{
						sCommand = string.Format("{0}={1}&iKName={2}&iColor={3}&iMemo={4}",
												ComCls.cConst.PC_WEBSQL_CMD_SP, "SP_BOM_CUD",
												this.mv_oFunc.pf_WpUrlEncode(this.txtKName.Text),
												this.mv_oFunc.pf_WpUrlEncode(this.txtColor.Text),
												this.mv_oFunc.pf_WpUrlEncode(this.txtMemo.Text));
					}

					this.txtCommand.Text = sCommand;
				}
				//---------------------------------------------------------------------------------------------------
				//트랜잭션 모드 명령어 & 입력/수정/삭제 작업 처리
				//---------------------------------------------------------------------------------------------------
				if (this.radioModeTCUD.Checked == true)
				{
					this.txtCommand.Text = "";
				}
				//---------------------------------------------------------------------------------------------------
				//전체 경로 만들기
				//---------------------------------------------------------------------------------------------------
				sResult = string.Format("{0}?{1}&{2}&{3}&{4}",
										ComCls.cConst.PC_WEBSQL_WEBPARSE_URL,
										this.txtMode.Text,
										this.txtType.Text,
										this.txtStyle.Text,
										this.txtCommand.Text);
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return sResult;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>웹 파즈 Url 만들기(TCUD)</summary>
		/// <param name="eCommand">트랜잭션 처리시 명령</param>
		/// <param name="sSID">트랜잭션 처리시 세션 ID</param>
		/// <param name="nRow">트랜잭션 처리시 데이터그리드뷰 행번호</param>
		/// <param name="sUrl">트랜잭션 처리시WebParse 경로 전달</param>
		/// <returns>bool</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private bool mf_MakeWpUrlAndTCUD(ComCls.cConst.PE_DB_TRANSACTION_COMMAND eCommand, string sSID, DataGridView oDataGridView, int nRow, ref string sUrl)
		{
			bool bResult = true;
			string sStyle = null;
			string sCommand = null;
			string sKName = null;
			string sColor = null;
			string sID = null;
			string sJobMode = null;

			try
			{
				if (this.radioStyleText.Checked == true) sStyle = ComCls.cConst.PC_WEBSQL_CMD_TEXT;
				if (this.radioStyleSp.Checked == true) sStyle = ComCls.cConst.PC_WEBSQL_CMD_SP;

				//---------------------------------------------------------------------------------------------------
				//트랜잭션 모드 명령어 & 입력/수정/삭제 작업 처리
				//---------------------------------------------------------------------------------------------------
				switch (eCommand)
				{
					//데이터베이스 연결
					case ComCls.cConst.PE_DB_TRANSACTION_COMMAND.CONNECT:
						sCommand = string.Format("{0}={1}", sStyle, ComCls.cConst.PC_DB_TRANSACTION_CONNECT);

						break;
					//데이터베이스 트랜잭션 시작
					case ComCls.cConst.PE_DB_TRANSACTION_COMMAND.BEGINTRAN:
						sCommand = string.Format("{0}={1}&{2}={3}",
												sStyle, ComCls.cConst.PC_DB_TRANSACTION_BEGINTRAN,
												ComCls.cConst.PC_WEBSQL_CMD_SID, sSID);

						break;
					//데이터베이스 Sql 처리(입력/수정/삭제)
					case ComCls.cConst.PE_DB_TRANSACTION_COMMAND.EXECSQL:
						sJobMode = oDataGridView.Rows[nRow].Cells["dgvcolMemo"].Value.ToString();

						if (sJobMode != ComCls.cConst.PC_DB_JOBMODE_READ)
						{
							sKName = this.mv_oFunc.pf_WpUrlEncode(oDataGridView.Rows[nRow].Cells["dgvcolKName"].Value.ToString());
							sColor = this.mv_oFunc.pf_WpUrlEncode(oDataGridView.Rows[nRow].Cells["dgvcolColor"].Value.ToString());
							sID = this.mv_oFunc.pf_WpUrlEncode(oDataGridView.Rows[nRow].Cells["dgvcolID"].Value.ToString());

							if (this.radioStyleText.Checked == true)
							{
								sCommand = string.Format("CmdTXT=UPDATE TB_BOM SET KName = '{0}', Color = '{1}', Memo = '{2}' WHERE ID = '{3}'&{4}={5}",
														sKName, sColor, "R", sID,
														ComCls.cConst.PC_WEBSQL_CMD_SID, sSID);
							}
							else
							{
								sCommand = string.Format("{0}={1}&iID={2}&iKName={3}&iColor={4}&iMemo={5}&{6}={7}",
														ComCls.cConst.PC_WEBSQL_CMD_SP, "SP_BOM_TCUD",
														sID, sKName, sColor, "R",
														ComCls.cConst.PC_WEBSQL_CMD_SID, sSID);
							}

							this.txtCommand.Text = sCommand;
						}
						else
						{
							bResult = false;
						}

						break;
					//데이터베이스 트랜잭션 완료
					case ComCls.cConst.PE_DB_TRANSACTION_COMMAND.COMMIT:
						sCommand = string.Format("{0}={1}&{2}={3}",
												sStyle, ComCls.cConst.PC_DB_TRANSACTION_COMMIT,
												ComCls.cConst.PC_WEBSQL_CMD_SID, sSID);

						break;
					//데이터베이스 트랜잭션 취소
					case ComCls.cConst.PE_DB_TRANSACTION_COMMAND.ROLLBACK:
						sCommand = string.Format("{0}={1}&{2}={3}",
												sStyle, ComCls.cConst.PC_DB_TRANSACTION_ROLLBACK,
												ComCls.cConst.PC_WEBSQL_CMD_SID, sSID);

						break;
					//데이터베이스 연결 끊기
					case ComCls.cConst.PE_DB_TRANSACTION_COMMAND.DISCONNECT:
						sCommand = string.Format("{0}={1}&{2}={3}",
												sStyle, ComCls.cConst.PC_DB_TRANSACTION_DISCONNECT,
												ComCls.cConst.PC_WEBSQL_CMD_SID, sSID);

						break;
				}
				//---------------------------------------------------------------------------------------------------
				//전체 경로 만들기
				//---------------------------------------------------------------------------------------------------
				if (bResult == true)
				{
					sUrl = string.Format("{0}?{1}&{2}&{3}&{4}",
										ComCls.cConst.PC_WEBSQL_WEBPARSE_URL,
										this.txtMode.Text,
										this.txtType.Text,
										this.txtStyle.Text,
										sCommand);
				}
				else sUrl = null;
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				sUrl = null;
				bResult = false;

				throw ex;
			}

			return bResult;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>SQL 실행</summary>
		/// <returns>bool</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private bool mf_ExecSql(ComCls.cConst.PE_WEBSQL_MODE eMode, ComCls.cConst.PE_WEBSQL_TYPE eType)
		{
			bool bResult = false;

			//---------------------------------------------------------------------------------------------------
			//Sql 실행 관련
			//---------------------------------------------------------------------------------------------------
			string sDataSet = null;
			DataSet oDataSet = null;
			int nRowCount = 0;
			int nColCount = 0;
			string sErrorMsg = null;
			string sSID = null;
			//---------------------------------------------------------------------------------------------------
			string sUrl = null;
			string sJobMode = null;
			string sUserErrorMsg = null;
			//---------------------------------------------------------------------------------------------------

			try
			{
				switch (eMode)
				{
					//---------------------------------------------------------------------------------------------------
					//SELECT 쿼리 실행 & 결과 읽기
					//---------------------------------------------------------------------------------------------------
					case ComCls.cConst.PE_WEBSQL_MODE.R:
						if (this.mv_oFunc.pf_WpExecSql(eMode, eType, this.txtUrl.Text, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg) == true)
						{
							//---------------------------------------------------------------------------------------------------
							//데이터셋 행/열 수 출력
							//---------------------------------------------------------------------------------------------------
							this.txtRows.Text = nRowCount.ToString();
							this.txtCols.Text = nColCount.ToString();
							//---------------------------------------------------------------------------------------------------
							//데이터 셋을 데이터그리드뷰 객체에 출력
							//---------------------------------------------------------------------------------------------------
							if (this.radioSelectDataGridView.Checked == true)
							{
								//홀수행 색상 변경
								this.dgvMan.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
								this.mv_oFunc.pf_WpOutputDataSetToDataGridView(eType, this.dgvMan, sDataSet, oDataSet, true);
							}
							//---------------------------------------------------------------------------------------------------
							//데이터 셋을 리스트뷰 객체에 출력
							//---------------------------------------------------------------------------------------------------
							if (this.radioSelectListView.Checked == true)
							{
								this.mv_oFunc.pf_WpOutputDataSetToListView(eType, this.listMan, sDataSet, oDataSet, true);
							}
							//---------------------------------------------------------------------------------------------------
							//데이터 셋을 트리뷰 객체에 출력
							//---------------------------------------------------------------------------------------------------
							if (this.radioSelectTreeView.Checked == true)
							{
								this.mv_oFunc.pf_WpOutputDataSetToTreeView(eType,
																			this.treeMan,
																			null,
																			this.txtRootParentID.Text,
																			sDataSet,
																			oDataSet,
																			Convert.ToInt16(this.txtDispLevel.Text),
																			true, true);
							}
							//---------------------------------------------------------------------------------------------------
							//데이터 셋을 트리 리스트 뷰 객체에 출력
							//---------------------------------------------------------------------------------------------------
							if (this.radioSelectTreeListView.Checked == true)
							{
								this.mv_oFunc.pf_WpOutputDataSetToTreeListView(eType,
																			this.treeListMan,
																			null,
																			this.txtRootParentID.Text,
																			sDataSet,
																			oDataSet,
																			new int[] { 0, 1, 6 },
																			new int[] { 0, 1, 6 },
																			Convert.ToInt16(this.txtDispLevel.Text),
																			true, true);
							}
							//---------------------------------------------------------------------------------------------------
							//조회 메시지 출력
							//---------------------------------------------------------------------------------------------------
							ComCls.cException.MessageBoxShow(this, string.Format("{0} {1}", nRowCount, ComCls.cConst.PC_MSG_APPBOM_SELECT), ComCls.cConst.PC_MSG_APPBOM_SELECT_TITLE);
							//---------------------------------------------------------------------------------------------------

							bResult = true;
						}
						else
						{
							//---------------------------------------------------------------------------------------------------
							//시스템 오류 메시지 출력
							//---------------------------------------------------------------------------------------------------
							if (sErrorMsg != null)
							{
								ComCls.cException.ExceptionMessage(this, sErrorMsg, "mf_ExecSql()");
							}
							//---------------------------------------------------------------------------------------------------
						}

						break;
					//---------------------------------------------------------------------------------------------------
					//INSERT/UPDATE/DELETE Sql 실행 & 결과 읽기
					//---------------------------------------------------------------------------------------------------
					case ComCls.cConst.PE_WEBSQL_MODE.CUD:
						if (this.mv_oFunc.pf_WpExecSql(eMode, eType, this.txtUrl.Text, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg) == true)
						{
							//---------------------------------------------------------------------------------------------------
							//데이터셋 행/열 수 출력
							//---------------------------------------------------------------------------------------------------
							this.txtRows.Text = nRowCount.ToString();
							this.txtCols.Text = nColCount.ToString();
							//---------------------------------------------------------------------------------------------------
							//수정 메시지 출력
							//---------------------------------------------------------------------------------------------------
							ComCls.cException.MessageBoxShow(this, string.Format("{0} {1}", nRowCount, ComCls.cConst.PC_MSG_APPBOM_UPDATE), ComCls.cConst.PC_MSG_APPBOM_UPDATE_TITLE);
							//---------------------------------------------------------------------------------------------------

							bResult = true;
						}
						else
						{
							//---------------------------------------------------------------------------------------------------
							//시스템 오류 메시지 출력
							//---------------------------------------------------------------------------------------------------
							if (sErrorMsg != null)
							{
								ComCls.cException.ExceptionMessage(this, sErrorMsg, "mf_ExecSql()");
							}
							//---------------------------------------------------------------------------------------------------
						}

						break;
					//---------------------------------------------------------------------------------------------------
					//트랜잭션 모드 INSERT/UPDATE/DELETE Sql 실행 & 결과 읽기
					//---------------------------------------------------------------------------------------------------
					case ComCls.cConst.PE_WEBSQL_MODE.TCUD:
						//데이터베이스 연결 명령 만들기
						if (this.mf_MakeWpUrlAndTCUD(ComCls.cConst.PE_DB_TRANSACTION_COMMAND.CONNECT, null, null, -1, ref sUrl) == true)
						{
							//데이터베이스 연결
							if (this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg, ref sSID) == true)
							{
								this.txtSID.Text = sSID;

								//세션 ID가 생성된 경우
								if (sSID != null)
								{
									//데이터베이스 트랜잭션 시작 명령 만들기
									if (this.mf_MakeWpUrlAndTCUD(ComCls.cConst.PE_DB_TRANSACTION_COMMAND.BEGINTRAN, sSID, null, -1, ref sUrl) == true)
									{
										//데이터베이스 트랜잭션 시작
										if (this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg, ref sSID) == true)
										{
											this.txtRows.Text = "0";

											//---------------------------------------------------------------------------------------------------
											//데이터그리드뷰를 스캔해서 수정된 행을 DB-UPDATE 처리
											//---------------------------------------------------------------------------------------------------
											for (int nRow = 0; nRow < this.dgvMan.Rows.Count - 1; nRow++)
											{
												//데이터베이스 Sql 명령 만들기
												if (this.mf_MakeWpUrlAndTCUD(ComCls.cConst.PE_DB_TRANSACTION_COMMAND.EXECSQL, sSID, this.dgvMan, nRow, ref sUrl) == true)
												{
													//데이터베이스 Sql 처리
													if (this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg, ref sSID) == true)
													{
														//데이터셋 행/열 수 출력
														this.txtRows.Text = (Convert.ToInt32(this.txtRows.Text) + nRowCount).ToString();
														this.txtCols.Text = nColCount.ToString();

														//데이터베이스 처리 성공인 경우
														if (nRowCount > 0)
														{
															bResult = true;
														}
														else
														{
															bResult = false;

															sUserErrorMsg = string.Format("{0}번 행에서", nRow + 1);

															//에러 발생 행 선택
															this.mv_oFunc.pf_DataGridViewAllUnSelectCell(this.dgvMan, nRow);

															break;
														}
														//---------------------------------------------------------------------------------------------------
													}
													else
													{
														bResult = false;

														break;
													}
												}
											}
											//---------------------------------------------------------------------------------------------------
											//데이터베이스 트랜잭션 처리
											//---------------------------------------------------------------------------------------------------
											if (bResult == true)
											{
												//데이터베이스 트랜잭션 완료 명령 만들기
												if (this.mf_MakeWpUrlAndTCUD(ComCls.cConst.PE_DB_TRANSACTION_COMMAND.COMMIT, sSID, null, -1, ref sUrl) == true)
												{
													//데이터베이스 트랜잭션 완료
													if (this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg, ref sSID) == true)
													{
														//데이터그리드뷰를 스캔해서 수정된 행 플래그를 조회 모드로 변경
														for (int nRow = 0; nRow < this.dgvMan.Rows.Count - 1; nRow++)
														{
															sJobMode = this.dgvMan.Rows[nRow].Cells["dgvcolMemo"].Value.ToString();

															if (sJobMode != ComCls.cConst.PC_DB_JOBMODE_READ)
															{
																this.dgvMan.Rows[nRow].Cells["dgvcolMemo"].Value = "R";
															}
														}

														this.dgvMan.Refresh();
													}
												}
											}
											else
											{
												//데이터베이스 트랜잭션 취소 명령 만들기
												if (this.mf_MakeWpUrlAndTCUD(ComCls.cConst.PE_DB_TRANSACTION_COMMAND.ROLLBACK, sSID, null, -1, ref sUrl) == true)
												{
													//데이터베이스 트랜잭션 취소
													this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg, ref sSID);
												}
											}
											//---------------------------------------------------------------------------------------------------
										}
									}
								}
							}
						}
						//---------------------------------------------------------------------------------------------------
						//메시지 처리
						//---------------------------------------------------------------------------------------------------
						if (bResult == true)
						{
							//수정 메시지 출력
							ComCls.cException.MessageBoxShow(this, string.Format("{0} {1}", this.txtRows.Text, ComCls.cConst.PC_MSG_APPBOM_UPDATE), ComCls.cConst.PC_MSG_APPBOM_UPDATE_TITLE);
						}
						else
						{
							//사용자 오류 메시지 출력
							if (sUserErrorMsg != null)
							{
								ComCls.cException.MessageBoxShow(this, string.Format("{0}{1}", sUserErrorMsg, ComCls.cConst.PC_MSG_APPBOM_UPDATE_ERROR), ComCls.cConst.PC_MSG_APPBOM_UPDATE_TITLE);
							}
							//시스템 오류 메시지 출력
							if (sErrorMsg != null)
							{
								ComCls.cException.ExceptionMessage(this, sErrorMsg, "mf_ExecSql()");
							}
						}
						//---------------------------------------------------------------------------------------------------
						//데이터베이스 연결 끊기 명령 만들기
						//---------------------------------------------------------------------------------------------------
						if (this.mf_MakeWpUrlAndTCUD(ComCls.cConst.PE_DB_TRANSACTION_COMMAND.DISCONNECT, sSID, null, -1, ref sUrl) == true)
						{
							//데이터베이스 연결 끊기
							bool b = this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg, ref sSID);
						}
						//---------------------------------------------------------------------------------------------------

						break;
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				//---------------------------------------------------------------------------------------------------
				//Debug Agent 인스턴스 있는 경우
				//---------------------------------------------------------------------------------------------------
				if (this.mv_frmMain.pv_frmDebugAgent != null)
				{
					this.mv_frmMain.pv_frmDebugAgent.pf_OutputDebugInfo(eType, this.txtUrl.Text, sDataSet, oDataSet);
				}
				//---------------------------------------------------------------------------------------------------
			}

			return bResult;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리뷰 노드가 확장될때 하위노드의 자식들이 모두 없는경우 DB 읽기</summary>
		/// <param name="oTreeView">트리뷰 객체 핸들</param>
		/// <param name="oTreeNode">확장한 트리 노드 객체 핸들</param>
		/// <param name="e">트리뷰 노드가 확장될때 발생하는 이벤트 인자</param>
		/// <param name="bTreeNodeExpandAlwaysDbReadOK">트리뷰 노드가 확장될때 항상 데이터베이스에서 하위노드를 읽는지 여부</param>
		/// <returns>bool</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private bool mf_TreeNode_BeforeExpand_ExecSql(TreeView oTreeView, TreeViewCancelEventArgs e, TreeNode oTreeNode, bool bTreeNodeExpandAlwaysDbReadOK)
		{
			bool bResult = false;
			bool bLastNodeOK = true;

			//---------------------------------------------------------------------------------------------------
			//Sql 실행 관련
			//---------------------------------------------------------------------------------------------------
			ComCls.cConst.PE_WEBSQL_MODE eMode = ComCls.cConst.PE_WEBSQL_MODE.EMPTY;
			ComCls.cConst.PE_WEBSQL_TYPE eType = ComCls.cConst.PE_WEBSQL_TYPE.EMPTY;
			string sDataSet = null;
			DataSet oDataSet = null;
			int nRowCount = 0;
			int nColCount = 0;
			string sErrorMsg = null;
			//---------------------------------------------------------------------------------------------------

			try
			{
				//---------------------------------------------------------------------------------------------------
				//트리뷰 구성이 끝났는지
				//---------------------------------------------------------------------------------------------------
				if(this.mv_oFunc.pv_TreeView_eTreeViewStatus == ComCls.cConst.PE_TREEVIEW_DATASTATUS.COMPLETE)
				{
					if (oTreeNode.Nodes != null && oTreeNode.Nodes.Count > 0)
					{
						if (bTreeNodeExpandAlwaysDbReadOK == false)
						{
							//---------------------------------------------------------------------------------------------------
							//오픈한 노드의 모든 자식노드가 마지막 노드인지 확인
							//---------------------------------------------------------------------------------------------------
							for (int nNum = 0; nNum < oTreeNode.Nodes.Count; nNum++)
							{
								if (oTreeNode.Nodes[nNum].Nodes.Count > 0)
								{
									bLastNodeOK = false;
									break;
								}
								//if (e.Node.Nodes[nNum].LastNode != null)
								//{
								//    bLastNodeOK = false;
								//    break;
								//}
							}
						}
					}

					if (bLastNodeOK == true)
					{
						//---------------------------------------------------------------------------------------------------
						//오픈한 노드의 모든 자식노드를 2레벨로 읽기위해
						//---------------------------------------------------------------------------------------------------
						this.txtLevel.Text = ComCls.cConst.PC_TREEVIEW_NODEEXPAND_DBREAD_LEVEL.ToString();
						this.txtRootID.Text = oTreeNode.Name;
						//---------------------------------------------------------------------------------------------------
						//CRUD 작업 결정
						//---------------------------------------------------------------------------------------------------
						eMode = ComCls.cConst.PE_WEBSQL_MODE.R;
						//---------------------------------------------------------------------------------------------------
						//데이터셋 반환 타입 결정
						//---------------------------------------------------------------------------------------------------
						if (this.radioTypeParse.Checked == true) eType = ComCls.cConst.PE_WEBSQL_TYPE.PARSE;
						if (this.radioTypeXml.Checked == true) eType = ComCls.cConst.PE_WEBSQL_TYPE.XML;
						//---------------------------------------------------------------------------------------------------
						//쿼리 실행 & 결과 읽기
						//---------------------------------------------------------------------------------------------------
						if (this.mv_oFunc.pf_WpExecSql(eMode, eType, this.txtUrl.Text, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg) == true)
						{
							//---------------------------------------------------------------------------------------------------
							//Sql 처리 방식(CRUD)에 따라 메시지 처리 구분
							//---------------------------------------------------------------------------------------------------
							if (this.radioModeR.Checked == true)
							{
								//---------------------------------------------------------------------------------------------------
								//데이터 셋을 트리뷰 객체에 출력
								//---------------------------------------------------------------------------------------------------
								if (this.radioSelectTreeView.Checked == true)
								{
									this.mv_oFunc.pf_WpOutputDataSetToTreeView(eType,
																				oTreeView,
																				oTreeNode,
																				this.txtRootID.Text,
																				sDataSet,
																				oDataSet,
																				ComCls.cConst.PC_TREEVIEW_NODEEXPAND_DBREAD_LEVEL - 1,
																				false, true);

									bResult = true;
								}
								//---------------------------------------------------------------------------------------------------
							}
						}
						else
						{
							//---------------------------------------------------------------------------------------------------
							//시스템 오류 메시지 출력
							//---------------------------------------------------------------------------------------------------
							if (sErrorMsg != null)
							{
								ComCls.cException.ExceptionMessage(this, sErrorMsg, "mf_TreeNode_BeforeExpand_ExecSql()");
							}
							//---------------------------------------------------------------------------------------------------
						}
					}
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
			finally
			{
				//---------------------------------------------------------------------------------------------------
				//Debug Agent 인스턴스 있는 경우
				//---------------------------------------------------------------------------------------------------
				if (this.mv_frmMain.pv_frmDebugAgent != null)
				{
					this.mv_frmMain.pv_frmDebugAgent.pf_OutputDebugInfo(eType, this.txtUrl.Text, sDataSet, oDataSet);
				}
				//---------------------------------------------------------------------------------------------------
			}

			return bResult;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리뷰 컨텍스트 메뉴 아이템 클릭할 때 처리</summary>
		/// <param name="sender">트리뷰 컨텍스트 메뉴 아이템 객체 핸들</param>
		/// <param name="e">트리뷰 컨텍스트 메뉴에서 클릭되면 전달되는 인자</param>
		/// <returns>void</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private bool mf_TreeNode_ContextMenu_Click(TreeView oTreeView, ContextMenu oContextMenu, MenuItem oMenuItem, int nSelectedIndex)
		{
			bool bResult = false;

			try
			{
				switch (oMenuItem.Text)
				{
					case "Copy":
						MessageBox.Show("Copy 선택...");
						oContextMenu.MenuItems["Copy"].Enabled = false;
						break;
					case "Move":
						MessageBox.Show("Move 선택...");
						oContextMenu.MenuItems["Move"].Enabled = false;
						break;
					case "Paste":
						MessageBox.Show("Paste 선택...");
						oContextMenu.MenuItems["Paste"].Enabled = false;
						break;
					case "Delete":
						oContextMenu.MenuItems["Copy"].Enabled = true;
						oContextMenu.MenuItems["Move"].Enabled = true;
						oContextMenu.MenuItems["Paste"].Enabled = true;

						this.mf_TreeNode_Delete_ExecSql(oTreeView);
						break;
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}

			return bResult;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리뷰 컨텍스트 메뉴 아이템에서 Delete 메뉴 선택하면 실행</summary>
		/// <param name="oTreeView">트리뷰 객체 핸들</param>
		/// <param name="oTreeNode">확장한 트리 노드 객체 핸들</param>
		/// <param name="e">트리뷰 노드가 확장될때 발생하는 이벤트 인자</param>
		/// <param name="bTreeNodeExpandAlwaysDbReadOK">트리뷰 노드가 확장될때 항상 데이터베이스에서 하위노드를 읽는지 여부</param>
		/// <returns>bool</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private bool mf_TreeNode_Delete_ExecSql(TreeView oTreeView)//, TreeViewCancelEventArgs e, TreeNode oTreeNode, bool bTreeNodeExpandAlwaysDbReadOK)
		{
			bool bResult = false;
			DialogResult dlgResult = System.Windows.Forms.DialogResult.None;
			string sMessage = null;

			//---------------------------------------------------------------------------------------------------
			//Sql 실행 관련
			//---------------------------------------------------------------------------------------------------
			string sUrl = null;
			ComCls.cConst.PE_WEBSQL_MODE eMode = ComCls.cConst.PE_WEBSQL_MODE.EMPTY;
			ComCls.cConst.PE_WEBSQL_TYPE eType = ComCls.cConst.PE_WEBSQL_TYPE.EMPTY;
			string sDataSet = null;
			DataSet oDataSet = null;
			int nRowCount = 0;
			int nColCount = 0;
			string sErrorMsg = null;
			//---------------------------------------------------------------------------------------------------

			try
			{
				if (oTreeView.SelectedNode != null)
				{
					sMessage = string.Format("[{0}] ", oTreeView.SelectedNode.Text);

					dlgResult = ComCls.cException.MessageConfirmBoxShow(this, sMessage + ComCls.cConst.PC_MSG_TREENODE_DELETE, ComCls.cConst.PC_MSG_TREENODE_DELETE_TITLE);

					if (dlgResult == System.Windows.Forms.DialogResult.Yes)
					{
						//---------------------------------------------------------------------------------------------------
						//CRUD 작업 결정
						//---------------------------------------------------------------------------------------------------
						eMode = ComCls.cConst.PE_WEBSQL_MODE.CUD;
						//---------------------------------------------------------------------------------------------------
						//데이터셋 반환 타입 결정
						//---------------------------------------------------------------------------------------------------
						eType = ComCls.cConst.PE_WEBSQL_TYPE.PARSE;
						//---------------------------------------------------------------------------------------------------
						//전체 경로 만들기(?Mode=CUD&Type=PARSE&Style=SP&CmdSP=SP_BOM_TREE_CUD&iGRP_OBJECTID=0&iOBJECTID=0&iPAR_OBJECTID=0)
						//---------------------------------------------------------------------------------------------------
						sUrl = string.Format("{0}?" +
											 "{1}={2}&{3}={4}&{5}={6}&{7}={8}&" +
											 "iJOBMODE={9}&iGRP_OBJECTID={10}&iOBJECTID={11}&iPAR_OBJECTID={12}",
											 ComCls.cConst.PC_WEBSQL_WEBPARSE_URL,
											 ComCls.cConst.PC_WEBSQL_MODE, ComCls.cConst.PC_WEBSQL_MODE_CUD,
											 ComCls.cConst.PC_WEBSQL_TYPE, ComCls.cConst.PC_WEBSQL_TYPE_PARSE,
											 ComCls.cConst.PC_WEBSQL_STYLE, ComCls.cConst.PC_WEBSQL_STYLE_SP,
											 ComCls.cConst.PC_WEBSQL_CMD_SP, "SP_BOM_TREE_CUD",
											 "TREENODE_DELETE", 2, oTreeView.SelectedNode.Name, -999);
						//---------------------------------------------------------------------------------------------------
						//쿼리 실행 & 결과 읽기
						//---------------------------------------------------------------------------------------------------
						if (this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg) == true)
						{
							if (oTreeView.SelectedNode.Parent != null)
							{
								oTreeView.SelectedNode.Remove();
							}
							//---------------------------------------------------------------------------------------------------
							//수정 메시지 출력
							//---------------------------------------------------------------------------------------------------
							ComCls.cException.MessageBoxShow(this, string.Format("{0}건 {1}", nRowCount, ComCls.cConst.PC_MSG_APPBOM_DELETE), ComCls.cConst.PC_MSG_APPBOM_DELETE_TITLE);
							//---------------------------------------------------------------------------------------------------
						}
						else
						{
							//---------------------------------------------------------------------------------------------------
							//시스템 오류 메시지 출력
							//---------------------------------------------------------------------------------------------------
							if (sErrorMsg != null)
							{
								ComCls.cException.ExceptionMessage(this, sErrorMsg, "mf_TreeNode_Delete_ExecSql()");
							}
							//---------------------------------------------------------------------------------------------------
						}

						bResult = true;
					}
				}
				else
				{
					ComCls.cException.MessageBoxShow(this, ComCls.cConst.PC_MSG_TREENODE_NOT_SELECTED, ComCls.cConst.PC_MSG_TREENODE_NOT_SELECTED_TITLE);
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
			finally
			{
				////---------------------------------------------------------------------------------------------------
				////Debug Agent 인스턴스 있는 경우
				////---------------------------------------------------------------------------------------------------
				//if (this.mv_frmMain.pv_frmDebugAgent != null)
				//{
				//    this.mv_frmMain.pv_frmDebugAgent.pf_OutputDebugInfo(eType, this.txtUrl.Text, sDataSet, oDataSet);
				//}
				////---------------------------------------------------------------------------------------------------
			}

			return bResult;
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리뷰 노드 드래그 드롭시 데이터베이스에 반영하고 다시 읽어서 트리뷰에 반영</summary>
		/// <param name="oTreeView">트리뷰 객체 핸들</param>
		/// <param name="e">트리뷰 노드를 드래그 드롭할 때 발생하는 이벤트 인자</param>
		/// <param name="oTreeNodeDragSource">트리뷰 노드를 드래그 드롭할 때 소스 노드 객체 핸들</param>
		/// <param name="oTreeNodeDragTarget">트리뷰 노드를 드래그 드롭할 때 타겟 노드 객체 핸들</param>
		/// <returns>bool</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		private bool mf_TreeNode_DragDrop_ExecSql(TreeView oTreeView, DragEventArgs e, TreeNode oTreeNodeDragSource, TreeNode oTreeNodeDragTarget)
		{
			bool bResult = false;
			DialogResult dlgResult = System.Windows.Forms.DialogResult.None;
			string sMessage = null;

			//---------------------------------------------------------------------------------------------------
			//Sql 실행 관련
			//---------------------------------------------------------------------------------------------------
			string sUrl = null;
			ComCls.cConst.PE_WEBSQL_MODE eMode = ComCls.cConst.PE_WEBSQL_MODE.EMPTY;
			ComCls.cConst.PE_WEBSQL_TYPE eType = ComCls.cConst.PE_WEBSQL_TYPE.EMPTY;
			string sDataSet = null;
			DataSet oDataSet = null;
			int nRowCount = 0;
			int nColCount = 0;
			string sErrorMsg = null;
			//---------------------------------------------------------------------------------------------------

			try
			{
				sMessage = string.Format("[{0}]를 \n[{1}]아래로 ", oTreeNodeDragSource.Text, oTreeNodeDragTarget.Text);

				switch(e.Effect)
				{
					//---------------------------------------------------------------------------------------------------
					//트리 노드 이동 작업
					//---------------------------------------------------------------------------------------------------
					case DragDropEffects.Move:
						dlgResult = ComCls.cException.MessageConfirmBoxShow(this, sMessage + ComCls.cConst.PC_MSG_TREENODE_MOVE, ComCls.cConst.PC_MSG_TREENODE_MOVE_TITLE);

						if (dlgResult == System.Windows.Forms.DialogResult.Yes)
						{
							//---------------------------------------------------------------------------------------------------
							//CRUD 작업 결정
							//---------------------------------------------------------------------------------------------------
							eMode = ComCls.cConst.PE_WEBSQL_MODE.CUD;
							//---------------------------------------------------------------------------------------------------
							//데이터셋 반환 타입 결정
							//---------------------------------------------------------------------------------------------------
							eType = ComCls.cConst.PE_WEBSQL_TYPE.PARSE;
							//---------------------------------------------------------------------------------------------------
							//전체 경로 만들기(?Mode=CUD&Type=PARSE&Style=SP&CmdSP=SP_BOM_TREE_CUD&iGRP_OBJECTID=0&iOBJECTID=0&iPAR_OBJECTID=0)
							//---------------------------------------------------------------------------------------------------
							sUrl = string.Format("{0}?" +
												 "{1}={2}&{3}={4}&{5}={6}&{7}={8}&" +
												 "iJOBMODE={9}&iGRP_OBJECTID={10}&iOBJECTID={11}&iPAR_OBJECTID={12}",
												 ComCls.cConst.PC_WEBSQL_WEBPARSE_URL,
												 ComCls.cConst.PC_WEBSQL_MODE, ComCls.cConst.PC_WEBSQL_MODE_CUD,
												 ComCls.cConst.PC_WEBSQL_TYPE, ComCls.cConst.PC_WEBSQL_TYPE_PARSE,
												 ComCls.cConst.PC_WEBSQL_STYLE, ComCls.cConst.PC_WEBSQL_STYLE_SP,
												 ComCls.cConst.PC_WEBSQL_CMD_SP, "SP_BOM_TREE_CUD",
												 "TREENODE_MOVE", 2, oTreeNodeDragSource.Name, oTreeNodeDragTarget.Name);
							//---------------------------------------------------------------------------------------------------
							//쿼리 실행 & 결과 읽기
							//---------------------------------------------------------------------------------------------------
							if (this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg) == true)
							{
								//---------------------------------------------------------------------------------------------------
								//수정 메시지 출력
								//---------------------------------------------------------------------------------------------------
								ComCls.cException.MessageBoxShow(this, string.Format("{0}건 {1}", nRowCount, ComCls.cConst.PC_MSG_APPBOM_UPDATE), ComCls.cConst.PC_MSG_APPBOM_UPDATE_TITLE);
								//---------------------------------------------------------------------------------------------------
							}
							else
							{
								//---------------------------------------------------------------------------------------------------
								//시스템 오류 메시지 출력
								//---------------------------------------------------------------------------------------------------
								if (sErrorMsg != null)
								{
									ComCls.cException.ExceptionMessage(this, sErrorMsg, "mf_TreeNode_DragDrop_ExecSql()");
								}
								//---------------------------------------------------------------------------------------------------
							}

							bResult = true;
						}

						break;
					//---------------------------------------------------------------------------------------------------
					//트리 노드 복사 작업
					//---------------------------------------------------------------------------------------------------
					case DragDropEffects.Copy:
						dlgResult = ComCls.cException.MessageConfirmBoxShow(this, sMessage + ComCls.cConst.PC_MSG_TREENODE_COPY, ComCls.cConst.PC_MSG_TREENODE_COPY_TITLE);

						if (dlgResult == System.Windows.Forms.DialogResult.Yes)
						{
							//---------------------------------------------------------------------------------------------------
							//CRUD 작업 결정
							//---------------------------------------------------------------------------------------------------
							eMode = ComCls.cConst.PE_WEBSQL_MODE.CUD;
							//---------------------------------------------------------------------------------------------------
							//데이터셋 반환 타입 결정
							//---------------------------------------------------------------------------------------------------
							eType = ComCls.cConst.PE_WEBSQL_TYPE.PARSE;
							//---------------------------------------------------------------------------------------------------
							//전체 경로 만들기(?Mode=CUD&Type=PARSE&Style=SP&CmdSP=SP_BOM_DRAGDROP_CUD&iGRP_OBJECTID=0&iOBJECTID=0&iPAR_OBJECTID=0)
							//---------------------------------------------------------------------------------------------------
							sUrl = string.Format("{0}?" +
												 "{1}={2}&{3}={4}&{5}={6}&{7}={8}&" +
												 "iJOBMODE={9}&iGRP_OBJECTID={10}&iOBJECTID={11}&iPAR_OBJECTID={12}",
												 ComCls.cConst.PC_WEBSQL_WEBPARSE_URL,
												 ComCls.cConst.PC_WEBSQL_MODE, ComCls.cConst.PC_WEBSQL_MODE_CUD,
												 ComCls.cConst.PC_WEBSQL_TYPE, ComCls.cConst.PC_WEBSQL_TYPE_PARSE,
												 ComCls.cConst.PC_WEBSQL_STYLE, ComCls.cConst.PC_WEBSQL_STYLE_SP,
												 ComCls.cConst.PC_WEBSQL_CMD_SP, "SP_BOM_TREE_CUD",
												 "TREENODE_COPY", 2, oTreeNodeDragSource.Name, oTreeNodeDragTarget.Name);
							//---------------------------------------------------------------------------------------------------
							//쿼리 실행 & 결과 읽기
							//---------------------------------------------------------------------------------------------------
							if (this.mv_oFunc.pf_WpExecSql(eMode, eType, sUrl, ref sDataSet, ref oDataSet, ref nRowCount, ref nColCount, ref sErrorMsg) == true)
							{
								//---------------------------------------------------------------------------------------------------
								//수정 메시지 출력
								//---------------------------------------------------------------------------------------------------
								ComCls.cException.MessageBoxShow(this, string.Format("{0}건 {1}", nRowCount, ComCls.cConst.PC_MSG_APPBOM_UPDATE), ComCls.cConst.PC_MSG_APPBOM_UPDATE_TITLE);
								//---------------------------------------------------------------------------------------------------
							}
							else
							{
								//---------------------------------------------------------------------------------------------------
								//시스템 오류 메시지 출력
								//---------------------------------------------------------------------------------------------------
								if (sErrorMsg != null)
								{
									ComCls.cException.ExceptionMessage(this, sErrorMsg, "mf_TreeNode_DragDrop_ExecSql()");
								}
								//---------------------------------------------------------------------------------------------------
							}

							bResult = true;
						}

						break;
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
			finally
			{
				////---------------------------------------------------------------------------------------------------
				////Debug Agent 인스턴스 있는 경우
				////---------------------------------------------------------------------------------------------------
				//if (this.mv_frmMain.pv_frmDebugAgent != null)
				//{
				//    this.mv_frmMain.pv_frmDebugAgent.pf_OutputDebugInfo(eType, this.txtUrl.Text, sDataSet, oDataSet);
				//}
				////---------------------------------------------------------------------------------------------------
			}

			return bResult;
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [공용(public) 함수(Method)/API - 클래스 외부로 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 첫 문자를 "pf_" + 함수명 또는 API 함수명 으로 시작
		//         - 영문 대소문자로 시작하고 함수명이 긴 경우 대소문자 구분해서 명명('_' 사용가능!)
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>공용(public) 함수(Method) 선언 예</summary>
		/// <param name="sStr">공용(public) 함수(Method) 인자 선언 예</param>
		/// <returns>string</returns>
		///-------------------------------------------------------------------------------------------------------------------------
		public string pf_Hello(string sStr)
		{
			try
			{
				sStr = "Hello...";
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return sStr;
		}
		#endregion

		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
		#region [전역(private) 시스템 이벤트함수 - 클래스 내부만 노출]
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		//명명규칙 - 없음!
		//▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>폼 로드 될 때 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void frmProtoType_Load(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//폼 최초 실행 시 초기화할 내용 처리
				//---------------------------------------------------------------------------------------------------
				this.mf_init();
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>폼 언로드 되고 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void frmProtoType_FormClosed(object sender, FormClosedEventArgs e)
		{
			try
			{
				//폼 닫기가 확정된 경우에만 해쉬에서 제거
				this.mv_oFunc.pf_AppBomRun(ComCls.cConst.PE_ARGTYPE_APP_STATUS.EXIT, this.Text, null, null);
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>폼 언로드 될 때 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void frmProtoType_FormClosing(object sender, FormClosingEventArgs e)
		{
			try
			{
				this.mv_oFunc.pf_CheckBomExitMsg(this.mv_frmMain.pv_bChildFormExitMsgDispOK, this.Text, ref e);
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioModeR 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioModeR_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//모드 결정(Mode=R)
				//---------------------------------------------------------------------------------------------------
				if (this.radioModeR.Checked == true)
				{
					this.txtMode.Text = string.Format("{0}={1}", ComCls.cConst.PC_WEBSQL_MODE, ComCls.cConst.PC_WEBSQL_MODE_R);
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioModeCUD 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioModeCUD_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//모드 결정(Mode=CUD)
				//---------------------------------------------------------------------------------------------------
				if (this.radioModeCUD.Checked == true)
				{
					this.txtMode.Text = string.Format("{0}={1}", ComCls.cConst.PC_WEBSQL_MODE, ComCls.cConst.PC_WEBSQL_MODE_CUD);
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioModeTCUD 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioModeTCUD_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//모드 결정(Mode=TCUD)
				//---------------------------------------------------------------------------------------------------
				if (this.radioModeTCUD.Checked == true)
				{
					this.txtMode.Text = string.Format("{0}={1}", ComCls.cConst.PC_WEBSQL_MODE, ComCls.cConst.PC_WEBSQL_MODE_TCUD);
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioTypeParse 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioTypeParse_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//타입 결정(Type=PARSE)
				//---------------------------------------------------------------------------------------------------
				if (this.radioTypeParse.Checked == true)
				{
					this.txtType.Text = string.Format("{0}={1}", ComCls.cConst.PC_WEBSQL_TYPE, ComCls.cConst.PC_WEBSQL_TYPE_PARSE);
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioTypeXml 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioTypeXml_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//타입 결정(Type=XML)
				//---------------------------------------------------------------------------------------------------
				if (this.radioTypeXml.Checked == true)
				{
					this.txtType.Text = string.Format("{0}={1}", ComCls.cConst.PC_WEBSQL_TYPE, ComCls.cConst.PC_WEBSQL_TYPE_XML);
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioStyleText 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioStyleText_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//스타일 결정(Style=TEXT)
				//---------------------------------------------------------------------------------------------------
				if (this.radioStyleText.Checked == true)
				{
					this.txtStyle.Text = string.Format("{0}={1}", ComCls.cConst.PC_WEBSQL_STYLE, ComCls.cConst.PC_WEBSQL_STYLE_TEXT);

					this.txtLevel.Enabled = false;
					this.txtRootID.Enabled = false;
					this.txtDispLevel.Enabled = false;
					this.btnRoot.Enabled = false;
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioStyleSp 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioStyleSp_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//---------------------------------------------------------------------------------------------------
				//스타일 결정(Style=SP)
				//---------------------------------------------------------------------------------------------------
				if (this.radioStyleSp.Checked == true)
				{
					this.txtStyle.Text = string.Format("{0}={1}", ComCls.cConst.PC_WEBSQL_STYLE, ComCls.cConst.PC_WEBSQL_STYLE_SP);

					this.txtLevel.Enabled = this.radioSelectTreeView.Checked || this.radioSelectTreeListView.Checked;
					this.txtDispLevel.Enabled = this.radioSelectTreeView.Checked || this.radioSelectTreeListView.Checked;
					this.txtRootID.Enabled = this.radioSelectTreeView.Checked;
					this.btnRoot.Enabled = this.radioSelectTreeView.Checked;
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioSelectDataGridView 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioSelectDataGridView_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				if (this.radioSelectDataGridView.Checked == true)
				{
					this.txtLevel.Enabled = false;
					this.txtRootID.Enabled = false;
					this.txtDispLevel.Enabled = false;
					this.btnRoot.Enabled = false;
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioSelectTreeView 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioSelectTreeView_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				if (this.radioSelectTreeView.Checked == true)
				{
					this.radioModeR.Checked = true;
					this.radioTypeParse.Checked = true;
					this.radioStyleSp.Checked = true;

					this.txtLevel.Enabled = true;
					this.txtRootID.Enabled = true;
					this.txtDispLevel.Enabled = true;
					this.btnRoot.Enabled = true;
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioSelectTreeListView 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioSelectTreeListView_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				if (this.radioSelectTreeListView.Checked == true)
				{
					this.radioModeR.Checked = true;
					this.radioTypeParse.Checked = true;
					this.radioStyleSp.Checked = true;

					this.txtLevel.Enabled = true;
					this.txtRootID.Enabled = true;
					this.txtDispLevel.Enabled = true;
					this.btnRoot.Enabled = true;
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>radioSelectListView 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void radioSelectListView_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				if (this.radioSelectListView.Checked == true)
				{
					this.txtLevel.Enabled = false;
					this.txtRootID.Enabled = false;
					this.txtDispLevel.Enabled = false;
					this.btnRoot.Enabled = false;
				}

				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>txtKName 변경 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void txtKName_TextChanged(object sender, EventArgs e)
		{
			try
			{
				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>txtColor 변경 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void txtColor_TextChanged(object sender, EventArgs e)
		{
			try
			{
				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>txtMemo 변경 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void txtMemo_TextChanged(object sender, EventArgs e)
		{
			try
			{
				this.txtUrl.Text = mf_MakeWpUrl();
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>txtLevel 변경 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void txtLevel_TextChanged(object sender, EventArgs e)
		{
			try
			{
				this.radioStyleSp_CheckedChanged(sender, e);

				if (this.txtLevel.Text != "")
				{
					this.txtDispLevel.Text = (int.Parse(this.txtLevel.Text) - 1).ToString();
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>txtRootID 변경 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void txtRootID_TextChanged(object sender, EventArgs e)
		{
			try
			{
				this.radioStyleSp_CheckedChanged(sender, e);
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>쿼리 실행 버튼 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnExecSql_Click(object sender, EventArgs e)
		{
			ComCls.cConst.PE_WEBSQL_MODE eMode = ComCls.cConst.PE_WEBSQL_MODE.EMPTY;
			ComCls.cConst.PE_WEBSQL_TYPE eType = ComCls.cConst.PE_WEBSQL_TYPE.EMPTY;

			try
			{
				//---------------------------------------------------------------------------------------------------
				//CRUD 작업 결정
				//---------------------------------------------------------------------------------------------------
				if (this.radioModeR.Checked == true) eMode = ComCls.cConst.PE_WEBSQL_MODE.R;
				if (this.radioModeCUD.Checked == true) eMode = ComCls.cConst.PE_WEBSQL_MODE.CUD;
				if (this.radioModeTCUD.Checked == true) eMode = ComCls.cConst.PE_WEBSQL_MODE.TCUD;
				//---------------------------------------------------------------------------------------------------
				//데이터셋 반환 타입 결정
				//---------------------------------------------------------------------------------------------------
				if (this.radioTypeParse.Checked == true) eType = ComCls.cConst.PE_WEBSQL_TYPE.PARSE;
				if (this.radioTypeXml.Checked == true) eType = ComCls.cConst.PE_WEBSQL_TYPE.XML;
				//---------------------------------------------------------------------------------------------------
				//Sql 실행(R/CUD/TCUD)
				//---------------------------------------------------------------------------------------------------
				this.mf_ExecSql(eMode, eType);
				//---------------------------------------------------------------------------------------------------
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>객체 초기화 버튼 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnClear_Click(object sender, EventArgs e)
		{
			try
			{
				this.dgvMan.DataSource = null;
				this.dgvMan.Rows.Clear();
				this.treeMan.Nodes.Clear();
				this.listMan.Items.Clear();

				this.txtRows.Text = "";
				this.txtCols.Text = "";
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리레벨/트리표시 깊이 초기화 버튼 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnRoot_Click(object sender, EventArgs e)
		{
			try
			{
				this.txtLevel.Text = (ComCls.cConst.PC_TREEVIEW_DEFAULT_DBREAD_LEVEL).ToString();

				this.txtRootID.Text = ComCls.cConst.PC_TREE_ROOT_PARENT_ID;
				this.txtRootParentID.Text = ComCls.cConst.PC_TREE_ROOT_PARENT_ID;
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리노드 확장시 항상 DB 읽기 설정 버튼 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void chkDBReadChildNodes_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				this.mv_oFunc.pv_TreeView_bTreeNodeExpandAlwaysDbReadOK = this.chkDBReadChildNodes.Checked;
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리를 만들때 루트를 부모기준(-1) 또는 자신기준 설정 버튼 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void chkDefaultParentID_CheckedChanged(object sender, EventArgs e)
		{
			try
			{
				//if (this.treeMan.SelectedNode != null)
				//{
				//    this.treeMan_AfterSelect(sender, new TreeViewEventArgs(this.treeMan.SelectedNode));
				//}
				//else this.txtRootID.Text = ComCls.cConst.PC_TREE_ROOT_ID;
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리노드 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void treeMan_AfterSelect(object sender, TreeViewEventArgs e)
		{
			string sParentID = null;

			try
			{
				if (this.treeMan.SelectedNode != null && this.treeMan.SelectedNode.Tag != null)
				{
					//---------------------------------------------------------------------------------------------------
					//태그 값이 문자열 배열인 경우(PARSE)
					//---------------------------------------------------------------------------------------------------
					if (this.treeMan.SelectedNode.Tag.GetType() == typeof(string[]))
					{
						string[] sCols = null;

						//태그를 문자열 배열로 변환
						sCols = (string[])this.treeMan.SelectedNode.Tag;

						if (sCols != null && sCols.Length > 1) sParentID = sCols[1];
					}
					//---------------------------------------------------------------------------------------------------
					//태그 값이 데이터로우인 경우(XML)
					//---------------------------------------------------------------------------------------------------
					else if (this.treeMan.SelectedNode.Tag.GetType() == typeof(DataRow))
					{
						DataRow drCols = null;

						//태그를 데이터로우로 변환
						drCols = (DataRow)this.treeMan.SelectedNode.Tag;

						if (drCols != null && drCols.ItemArray.Length > 1) sParentID = drCols.ItemArray[1].ToString();
					}

					this.txtRootID.Text = this.treeMan.SelectedNode.Name;
					this.txtRootParentID.Text = (sParentID != null) ? sParentID : "-1";
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업로드 버튼 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnFileUpLoad_Click(object sender, EventArgs e)
		{
			ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL eProtocol = ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.EMPTY;
			ComCls.cConst.PE_FILE_UPDOWN_TYPE eType = ComCls.cConst.PE_FILE_UPDOWN_TYPE.EMPTY;
			string sWebHttpServerPath = null;
			string sWebFtpServerPath = null;
			string sWebFtpServerFileNameReName = null;
			string sFilenamePath = null;

			DialogResult dResult = System.Windows.Forms.DialogResult.None;

			try
			{
				//---------------------------------------------------------------------------------------------------
				//파일 열기 다이얼로그 초기화
				//---------------------------------------------------------------------------------------------------
				this.openFileDialog1.Filter = "모든 파일|*.*|엑셀문서|*.xls*|파워포인트|*.ppt|워드문서|*.doc|텍스트문서|*.txt";
				this.openFileDialog1.FileName = "";
				dResult = this.openFileDialog1.ShowDialog();

				if (dResult == System.Windows.Forms.DialogResult.OK && this.openFileDialog1.FileName != "")
				{
					//---------------------------------------------------------------------------------------------------
					//업로드 다운로드 결정
					//---------------------------------------------------------------------------------------------------
					eType = ComCls.cConst.PE_FILE_UPDOWN_TYPE.UPLOAD;
					//---------------------------------------------------------------------------------------------------
					//완료 이벤트 핸들러(필요한 경우만)
					//---------------------------------------------------------------------------------------------------
					this.mv_oFunc.OnUpDownloadFileCompleted -= new ComCls.cFunction.UpDownloadFileCompleted(mv_oFunc_OnUpDownloadFileCompleted);
					this.mv_oFunc.OnUpDownloadFileCompleted += new ComCls.cFunction.UpDownloadFileCompleted(mv_oFunc_OnUpDownloadFileCompleted);
					//---------------------------------------------------------------------------------------------------
					//HTTP 사용
					//---------------------------------------------------------------------------------------------------
					if (this.radioHttp.Checked == true)
					{
						eProtocol = ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.HTTP;

						//sWebHttpServerPath = string.Format("{0}/{1}", "http://localhost/WebParse", "UpLoadFile.aspx");
						sWebHttpServerPath = string.Format("{0}/{1}", ComCls.cConst.PC_BOM_HTTP_FILEUPLOAD_URL, "UpLoadFile.aspx");
						sFilenamePath = this.openFileDialog1.FileName;

						//this.mv_oFunc.pf_FileUpDownLoad(eProtocol, eType, sWebHttpServerPath, sFilenamePath, null, null, false);
					}
					//---------------------------------------------------------------------------------------------------
					//FTP 사용
					//---------------------------------------------------------------------------------------------------
					if (this.radioFtp.Checked == true)
					{
						eProtocol = ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.FTP;

						//sWebFtpServerPath = string.Format("{0}/{1}", "ftp://localhost/UpDownFiles", this.openFileDialog1.SafeFileName);
						sWebFtpServerPath = string.Format("{0}/{1}/{2}", ComCls.cConst.PC_BOM_FTP_FILEUPLOAD_URL, "Cad", this.openFileDialog1.SafeFileName);
						sWebFtpServerFileNameReName = string.Format("{0}_{1}", this.openFileDialog1.SafeFileName, DateTime.Now.Ticks);
						sFilenamePath = this.openFileDialog1.FileName;

						this.mv_oFunc.pf_FileUpDownLoad(eProtocol, eType, sWebFtpServerPath, sWebFtpServerFileNameReName, sFilenamePath, "educ_ftp", "educ_ftp", false);
					}
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 다운로드 버튼 클릭 시 발생</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void btnFileDownLoad_Click(object sender, EventArgs e)
		{
			ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL eProtocol = ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.EMPTY;
			ComCls.cConst.PE_FILE_UPDOWN_TYPE eType = ComCls.cConst.PE_FILE_UPDOWN_TYPE.EMPTY;
			string sWebHttpServerPath = null;
			string sWebFtpServerPath = null;
			string sFilenamePath = null;

			DialogResult dResult = System.Windows.Forms.DialogResult.None;

			try
			{
				//---------------------------------------------------------------------------------------------------
				//파일 저장 다이얼로그 초기화
				//---------------------------------------------------------------------------------------------------
				this.saveFileDialog1.Filter = "모든 파일|*.*|엑셀문서|*.xls*|파워포인트|*.ppt|워드문서|*.doc|텍스트문서|*.txt";
				this.saveFileDialog1.FileName = "download29.zip";
				dResult = this.saveFileDialog1.ShowDialog();

				if (dResult == System.Windows.Forms.DialogResult.OK && this.saveFileDialog1.FileName != "")
				{
					//---------------------------------------------------------------------------------------------------
					//업로드 다운로드 결정
					//---------------------------------------------------------------------------------------------------
					eType = ComCls.cConst.PE_FILE_UPDOWN_TYPE.DOWNLOAD;
					//---------------------------------------------------------------------------------------------------
					//완료 이벤트 핸들러(필요한 경우만)
					//---------------------------------------------------------------------------------------------------
					this.mv_oFunc.OnUpDownloadFileCompleted -= new ComCls.cFunction.UpDownloadFileCompleted(mv_oFunc_OnUpDownloadFileCompleted);
					this.mv_oFunc.OnUpDownloadFileCompleted += new ComCls.cFunction.UpDownloadFileCompleted(mv_oFunc_OnUpDownloadFileCompleted);
					//---------------------------------------------------------------------------------------------------
					//HTTP 사용
					//---------------------------------------------------------------------------------------------------
					if (this.radioHttp.Checked == true)
					{
						eProtocol = ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.HTTP;

						//sWebHttpServerPath = string.Format("{0}/{1}", "http://localhost/WebParse/UpDownFiles", "download600.zip");
						sWebHttpServerPath = string.Format("{0}/{1}/{2}", ComCls.cConst.PC_BOM_HTTP_FILEDOWNLOAD_URL, "Cad", "download29.zip");
						sFilenamePath = this.saveFileDialog1.FileName;

						//this.mv_oFunc.pf_FileUpDownLoad(eProtocol, eType, sWebHttpServerPath, sFilenamePath, null, null, false);
					}
					//---------------------------------------------------------------------------------------------------
					//FTP 사용
					//---------------------------------------------------------------------------------------------------
					if (this.radioFtp.Checked == true)
					{
						eProtocol = ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.FTP;

						//sWebFtpServerPath = string.Format("{0}/{1}", "ftp://localhost/UpDownFiles", "download600.zip");
						sWebFtpServerPath = string.Format("{0}/{1}/{2}", ComCls.cConst.PC_BOM_FTP_FILEDOWNLOAD_URL, "Cad", "download29.zip");
						sFilenamePath = this.saveFileDialog1.FileName;

						this.mv_oFunc.pf_FileUpDownLoad(eProtocol, eType, sWebFtpServerPath, null, sFilenamePath, "educ_ftp", "educ_ftp", false);
					}
					//---------------------------------------------------------------------------------------------------
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>파일 업/다운로드 이벤트 핸들러</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void mv_oFunc_OnUpDownloadFileCompleted(object sender, ComCls.cConst.pv_strucFileUpDownloadInfo strucFileUpDownloadInfo)
		{
			string sMsg = null;

			try
			{
				if (strucFileUpDownloadInfo.eProtocol == ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.HTTP) sMsg = "HTTP ";
				else if (strucFileUpDownloadInfo.eProtocol == ComCls.cConst.PE_FILE_UPDOWN_PROTOCOL.FTP) sMsg = "FTP ";

				if (strucFileUpDownloadInfo.eType == ComCls.cConst.PE_FILE_UPDOWN_TYPE.UPLOAD) sMsg += "파일 업로드 ";
				else if (strucFileUpDownloadInfo.eType == ComCls.cConst.PE_FILE_UPDOWN_TYPE.DOWNLOAD) sMsg += "파일 다운로드 ";

				if (strucFileUpDownloadInfo.eStatus == ComCls.cConst.PE_FILE_UPDOWN_STATUS.COMPLETE) sMsg += "성공!";
				else if (strucFileUpDownloadInfo.eStatus == ComCls.cConst.PE_FILE_UPDOWN_STATUS.CANCEL) sMsg += "실패!";

				if (sMsg != null)
				{
					MessageBox.Show(sMsg, "파일 업/다운로드", MessageBoxButtons.OK, MessageBoxIcon.Information);
				}
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리 리스트 뷰 아이템 더블 클릭</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void treeListMan_DoubleClick(object sender, EventArgs e)
		{
			TreeListViewItem oItem = null;
			try
			{
				oItem = (sender as TreeListView).GetItemAt(this.mv_oFunc.pv_pTreeListItemMouse.X, this.mv_oFunc.pv_pTreeListItemMouse.Y);

				MessageBox.Show(oItem.Name);
				MessageBox.Show(oItem.SubItems[3].Name);
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		///-------------------------------------------------------------------------------------------------------------------------
		/// <summary>트리 리스트 뷰 아이템 클릭</summary>
		///-------------------------------------------------------------------------------------------------------------------------
		private void treeListMan_MouseClick(object sender, MouseEventArgs e)
		{
			try
			{
				this.mv_oFunc.pv_pTreeListItemMouse = e;
			}
			catch (Exception ex)
			{
				ComCls.cException.ExceptionMessageBox(ex, this);
			}
		}
		#endregion

		private void treeListMan_BeforeLabelEdit(object sender, TreeListViewBeforeLabelEditEventArgs e)
		{
			if (e.Item.ImageIndex < 1 || e.Item.ImageIndex > 2)
				e.ColumnIndex = 0;
			if (e.ColumnIndex == 1)
			{
				ComboBox combobox = new ComboBox();
				combobox.Items.AddRange(new string[] { "New value 1", "New value 2", "New value 3" });
				e.Editor = combobox;
			}
		}
		
		//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
	}// End class frmProtoType
}// End namespace TimsXBX
